﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLLTZS.Funcionalidad
{
    public class BLLOferta: BLLGenerico
    {
        public BLLOferta(TZSDataContext contexto) : base(contexto) { }
        public BLLOferta() : this(new TZSDataContext()) { }

        public bool Existe(string titulo)
        {
            return Contexto.TZS_Ofertas.Where(o => o.Titulo.ToLower().Equals(titulo.ToLower())).Count() > 0;
        }

        public void CargarNuevaOferta(TZS_Oferta nuevaOferta)
        {
            Contexto.TZS_Ofertas.InsertOnSubmit(nuevaOferta);
        }

        public List<TZS_Oferta> TraerOfertas(List<int> idsLocalidades, List<Ambitos> ambitos, List<int> idsTiposPuestos)
        {
            return (from o in Contexto.TZS_Ofertas
                    where o.Orden != null
                    && (idsLocalidades.Count > 0 && idsLocalidades.Contains(o.IdLocalidad) || idsLocalidades.Count == 0)
                    && (ambitos.Count > 0 && ambitos.Contains((Ambitos) o.Ambito) || ambitos.Count == 0)
                    && (idsTiposPuestos.Count > 0 && idsTiposPuestos.Contains(o.IdTipoPuesto) || idsTiposPuestos.Count == 0)
                    orderby o.Orden descending
                    select o).ToList();
        }

        public TZS_Oferta Traer(int idOferta)
        {
            return Contexto.TZS_Ofertas.Where(o => o.IdOferta == idOferta).FirstOrDefault();
        }

        public List<TZS_Oferta> TraerPostulaciones(string nombreUsuario)
        {
            return (from p in Contexto.TZS_Postulacions
                    where p.TZS_Usuario.NombreUsuario.ToLower().Equals(nombreUsuario.ToLower())
                    orderby p.Fecha descending
                    select p.TZS_Oferta).ToList();
        }

        public List<TZS_Oferta> TraerPostulaciones(int idUsuario)
        {
            return (from p in Contexto.TZS_Postulacions
                    where p.IdUsuario == idUsuario
                    orderby p.Fecha descending
                    select p.TZS_Oferta).ToList();
        }

        public List<TZS_Oferta> TraerFavoritos(string nombreUsuario)
        {
            return (from f in Contexto.TZS_Favoritos
                    where f.TZS_Usuario.NombreUsuario.ToLower().Equals(nombreUsuario.ToLower())
                    orderby f.Fecha descending
                    select f.TZS_Oferta).ToList();
        }

        public int? TraerSiguientePendiente(int idOfertaActual)
        {
            TZS_Oferta actual = Traer(idOfertaActual);

            if (actual.Orden != null)
                actual = null;

            bool encontrada = false;

            foreach (TZS_Oferta oferta in Contexto.TZS_Ofertas.Where(o => o.Orden == null).ToList())
            {
                if (actual == null || encontrada)
                    return oferta.IdOferta;

                encontrada = oferta.IdOferta == idOfertaActual;
            }

            return null;
        }

        public int? TraerUltimoOrden()
        {
            return (from o in Contexto.TZS_Ofertas
                    orderby o.Orden descending
                    select o.Orden).FirstOrDefault();
        }

        public void Aprobar(int idOferta)
        {
            int? orden = TraerUltimoOrden();

            if (orden == null)
                orden = 0;

            orden++;
            TZS_Oferta oferta = Traer(idOferta);
            oferta.Orden = orden;
        }
    }
}
